MadWay, любая карта это mpq архив
открываем карту в архиваторе и через блокнот меняем все названия
это даже проще чем через редактор ибо можно копировать-вставить
вот статья по некоторым файлам внутри архива
Эмм, формат w3x читаем, открываем мпк редактором и вытаскиваем необходимые файлы, редактор тут ненужен.
Погодь, Doodad Christmas - она же открыта, открой в редакторе и меняй.
с этим косяик есть. Если ты импортируешь в карту измененные с сохранения файлы, но с теми же путями - ты имеешь вероятность получить файлы с 0 байт(но чаще это только визуально 0 байт) либо остаётся старая версия. Бороться просто - переименовывать файлики в этот раз на "файл1" в следующий - обратно на "файл". Либо стараться реже реимпортировать одни и те же названия. Проверять багнулось ли лучше сразу.
Нашел ответ.
Использование mix архивов. Кидаем файлы в mix архив, сам архив в папку варкрафта, а в карте прописываем путь к файлу внутри архива. Варкрафт автоматически использует данные всех mix архивов в своей директории.
Осуществляешь импорт по неправильному пути. Например (я пробовал для орков), "Sound\Music\mp3Music\Orc1.mp3", "Sound\Music\mp3Music\Orc2.mp3", "Sound\Music\mp3Music\Orc3.mp3", "Sound\Music\mp3Music\Orc1X.mp3" и т.д. Все стандартные треки были заменены на мой. Чтобы корректно заменять музыку на карте, нужно знать пути импорта. Путь к оригинальным трекам можно посмотреть в mpq-архиве через архиваторы.
анимацию апгрейда можно проиграть
а чтоб постоянная была. то прописыают триггером тэг анимации. или видел как у Иллидана? там два юнита: охотник и демон. Посмотри как у демона сделано. там есть прописано alternate
что за костыли блин
событие - приводит способность в действие
условие - применённая способность == божественный щит
действия:
unit u=GetTriggerUnit()
SetUnitVertexColor(u,0,0,0,255)
TriggerSleepAction(15) // здесь указываем время действия способности
SetUnitVertexColor(u,255,255,255,255)
если время действия зависит от уровня то юзай арифметику как писали выше
в твоём случае это 2 + (уровень способности * 2)
через иф в действие записывать но это не кул EnergyFrost, не угадал)
и чем тебе функция не нравится?
функция Condition берёт функцию и возвращает условие
silence_AZ,
Вот вам пример, идите разбирайте его и читайте все статьи, что есть.
function UnitAddEffect takes unit u, real x, real y returns nothing
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Undead\\AnimateDead\\AnimateDeadTarget.mdl", x, y))
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", GetUnitX(u), GetUnitY(u)))
endfunction
function Action takes nothing returns nothing
local unit u = GetOrderedUnit()
local real x = GetOrderPointX()
local real y = GetOrderPointY()
call UnitAddEffect(u, x, y)
endfunction
function InitTrig_Effect takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = 0
loop
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
set i = i + 1
exitwhen i == 16
endloop
call TriggerAddAction( t, function Action )
endfunction
Создайте триггер "Effect", конвертируйте в текст, удалите все что там есть, копирните и вставьте мое, запускайте карту и побегайте юнитами.
То что я написал можно и нужно оптимизировать, но так как вам нужен пример создания пользовательский функций, то я сделал именно так.
Вот на всякий случай оптимизированный вариант.
SetUnitPosition довольно тяжелая операци, юзайте SetUnitX\Y в конце полета юзай SetUnitPosition для того чтобы юнит не залетел в непроходимое место.
Фильтр просто ужас, ну кто так фильтры делает?
Проверка на 'Aloc', я в ужасе на кой черт проверять на дамми если GropEnumUnitsInRange\Rect не выделяет москитов, тока EnumOfPlayer может пикнуть москитов, остальное не пикает их, на то они и москиты...
Вот как выглядит нормальный фильтр без локалок и прочего
function EnemyFilter takes nothing returns boolean
set bj_lastFilterUnit = GetFilterUnit( )
return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction
UnitDamageTargetEx - красиво но нафиг ненужно обводить в отдельную функцию с тучей аргументов + жутко неудобно, 100500 аргументов у функции и фиг знает за что какой от вечает, прямо так UnitDamageTarget, без отдельной функции.
Туча констант, тоже хорошо тока длят наработок, на деле ставь конкретные значения или юзай Difine vjass'a.
Ещё есть вариант - тревога это реакция нейтральных монстров на то, что недалеко от них появилось здание (когда начинаешь строить здание, и тут из леса прибегают нейтралы, ломают, и убегают обратно).
первая проверка - мб эта функция делает так что данный нейтрал игнорирует то что рядом с ним появится здание, и он в итоге не побежит его атаковать
вторая проверка - возможно функция делает само здание игнорируемым для этих нейтралов, т.е. конкретно на него не будут сбегаться ближайшие нейтралы
Я удалял всеь код кроме етой системы все ефект тотже. также я писал что переносил наработку на иную мапу и там все работало. понятно что проблема не в коде..по тому как баг в том что рынок(юнит) меняет владельца, на красного скажем, еслиб не менял багаб небыло, но есть карта где он есть.. на разных мапах при абсолютно едентичных настройках юнитов, и коде(никакого второстепенного кода нет тока тот что в 1м посту)
опшем так я психанул и начал отрезать куски из мапы, сначала в 10 раз удалил весь код кроме наработки, затем удалил итемы, и вернул код и вот чудо баг пропал, =============================================================================
думаю проблема была в том что иды предметам я в ручную прописывал, там была своя закономерность, но увы теперь придется периписать все иды предметов, и заминить их в коде что очень ни удобно и моторно=(
Нашёл систему, где звук передаётся в таймер, который истекает через 0 секунд. В результате один и тот же звук может проигрываться несколько раз без всяких проблем. В инетике пишут мол это такой баг движка.
Урон настраивается через уровень способности, или как было сказано unit - damage target
команда для использования нестандартной способности берется от той способности, на основе которой ты её сделал, и если это цепь тралла - Unit - issue order with targetign a unit - orc - chain lighting
Ну решается всё довольно тривиально
Юнит атакован
приказ атакующего юнита не равен "атаковать"
б.е. - приказать атакующий ПКМ атакованного
При первой атаке произойдёт небольшая потеря времени, т.к. получив при каз юнит заново начнёт анимацию атаки. Зато орб будет прокать.
Алсо если приказать юниту перейти нападая на противников (триггерно или ручками) - приказ юнита будет какой-надо и орб будет срабатывать.
quq_CCCP, вот только это не позволит юзать книгу пока спелл не перезарядится
событие - юнит приводит способность в действие
в условии проверяем что это способность из нашего спелбука
потом триггерно нажимаем кнопку отмена(Esc)
в гуи это находится в разделе игра
называется вроде игрок нажимает отмена
в джасс это делается с помощью ForceUICancelBJ
в качестве игрока передаём владельца триггерного юнита
если это игрок а не какой нибудь AI скрипт то сработает
Бывает необходимо скрыть в части анимаций какую то поверхность, например останки (скелет). Вы спокойно выбираете эту поверхность, и начинаете в каждой анимке в первом кадре выключать видимость (необходимо и достаточно выключать - включать видимость именно в первом кадре анимации), чисто случайно переходите ко второму кадру - ба!, видимость включилась, и так далее, вы пытаетесь выключить видимость во всех кадрах нужных анимаций, и совершенно зря.
Нужно просто открыть сохраненную модель с выключенной в первых кадрах анимаций видимостью, затем открыть ее в War3ME, открыть вкладку ОКНА - РЕДАКТОР АНИМАЦИЙ ПОВЕРХНОСТЕЙ, выбрать Geosetanimation, в которой Альфа анимирована (стоит галочка). Щёлкаем по кнопке Альфа, открывается список с адресами. адр еса должны идти в порядке возрастания, а у вас скорее всего запись 0 :0 или 0 :1 находится где то в середине списка. Просто удаляем эту запись и ставим ее в самом начале списка. Проверяем правильный порядок адресов, и если надо, то исправляем. После двоеточия должна стоять цифра 0 или 1, все цифры, отличные от этих, необходимо переправить на 0. Проверяем анимации, с видимостью все должно быть в порядке.
Такие же списки видимости бывают и у костей, и у эффектов, и у текстур, советую также их проверять, если занимались анимированием этих объектов.
делается в пару кликов в вот этой версии mdlvis'a...
удаляешь анимации, заходишь оптимизатор - проверяешь что стоит галочка на 3 пунке снизу, жмёшь Ок...
igor_razor, да, была такая программа. Как она называлась не помню. Matrix Eater или что-то такое. Советую поискать на хайве на форуме. Точно найдешь.
Еще можно в мдлвизе задать в глобальной анимации главной кости (обычно это bone_root) отрицательный масштаб -100 по оси Y и готово! ну, теоретически
Да, все верно, Matrix Eater. Ее автор Retera кстати - это чувак, который написал утилиту для генерации моих эффектов. Забавный факт. Вопрос закрываю, мой ответ вроде более чем полный.
Способ №1
Открываем модель в вар3ме, находим в "Менеджере последовательностей" спикок анимаций, находим нужную, открываем ее параметры, запоминаем интервал (диапазон кадров), например Stand [3000-4333]. Далее в "Редакторе узлов" находим нужную кость по названию, нажимаем правой редактировать узел, и в повороте, переносе и масштабировании удаляем все строки, которые попадают в диапазон кадров этой анимации.
Способ №2
Открываем модель в mdlvis, нажимаем "модули->редактор анимаций", выбираем " анимки", выбираем нужную анимацию, переключаемся на вкладку "движение", выделяем нужную кость, на линейке кадров выбираем первый кадр и с шифтом последний таким образом, чтобы выделить всю линейку, удаляем сразу все точки на линейке.
Способ №3
Конвертируем модель в текстовый формат .mdl, открываем файл в блокноте, находим блок со списком анимаций, затем блок с поворотом, переносом и масштабированием нужной кости и проделываем аналогично способу №1, в начале каждого блока указано количество строк в нем, при удалении строк нужно менять это значение.
Это происходит из-за per-vertex освещения. От подобных визуальных артефактов очень сложно избавиться, но можно немного замаскировать их, подкорректировав модели освещения (например, немного уменьшить интенсивность diffuse освещения и увеличить ambient):
Триггерно невозможно изменить урон стандартных способностей - тебе нужно полностью создавать весь эффект способности триггерно, а саму способность использовать только для запуска триггеров.
Наименее ресурсозатратным для игрового процесса будет кастовать саму волну через отдельного дамми, который создаётся специально и только для волны силы. Сама волна наносит 1 ед урона. И потом определив, тип юнит-источника урона - наносим нужный урон от лица героя-хозяина юнита "волна силы".
В варианте "чекать группы каждые 0.0х сек" будет засоряться память и скорее всего будут подлагивания, в варианте со спец-дамиками засорится РО, выбирай из двух зол.
Останавливаешь юнит во время каста заклинания.
Создаёшь дамика.
Даёшь кастуемую способность.
Даёшь приказы на направление способности.
другой триггер отлавливает получение урона юнитами и если тип источника урона - дамми, то нанести такой-то урон от лица героя-хозяина.
Astra, очень багано
так как после последней атаки может многое изменится
так же урон при событие юнит получает урон зависит от брони и прочих резистов
если юнит с уроном 100 нанёс удар по врагу с физ резистом 50% а потом получил бафф/предмет на +100 урона то скилом нанесёт 50 урона хотя должен был бы нанести 200
тут нужно юзать бд
при касте скила брать из бд начальный урон юнита, бонусы предметов и бонусы всех бафов
тема кстати уже много раз поднималась
и каждый раз все заканчивалось тем что афтар забивал на подобную систему либо писал "вы все нубы/тролли и не знаете/не хотите сказать как сделать это легко и просто"
ибо подобная система требует кучи кода и как минимум 30 прочтённых статей по jass
вот статья о бд
Поиграйся с орбэффектами, добавляя в разрешённые цели необходимую клиссификацию. А вообще, просто поступи так:
Атака есть изначально, но при ударе юнитом по камню или дереву, проверка, имеет ли он кирку, и если да, тогда ролить переменную от N до N, и если равно N - создать такой то ресурс.
Можно также сделать систему с уровнем кирки(ну типа деревянная каменная железная алмазная окда), и по уровню кирки определять коилчество последовательностей "Иначе": Роллить первое число от 1 до 100 - камень. Если не выпал, но кирка у тебя выше деревянной - Роллить от 1 до 200 - железо. Если не выпало, но кирка выше каменной - роллить от 1 до 1000 - аметист, и т.д.
Gerych, сюда тоже можно но вопрос будет закрыт через неделю с момента последнего ответа
ну а вообще для таких вещей стоит создать бложик и там в качестве ресурса подобное спрашивать
» WarCraft 3 / Перевод карты
» WarCraft 3 / Предмет в требованиях
» WarCraft 3 / Импорт музыки
» WarCraft 3 / Timer
» WarCraft 3 / Анимации
» WarCraft 3 / Вопрос о функции SetUnitBlendTime
» WarCraft 3 / Продать все предметы
» WarCraft 3 / ID Звука
» WarCraft 3 / Юниты атакуют и кастуют способности
» WarCraft 3 / Кости и анимации
» WarCraft 3 / Проблема с освещением
» WarCraft 3 / Триггерный урон
» WarCraft 3 / Изменение анимации (способность)
» WarCraft 3 / Изменение значения предмета.
» WarCraft 3 / Как сделать захват территории?